// 给定一个32位有符号整数x，将x进行反转

// 解题思路
// x的范围为[-2^31， 2^31 - 1]
// 反转的步骤就是让x不断对10取余，再除以10，得到每一位的数字，同时累积结果
// 累积结果的时候需要判断是否溢出
// 当ans * 10 + pop > INT_MAX或者ans * 10 + pop < INT_MIN时就会溢出
// 按题设要求无法在溢出后对其判断，那么如何在进行累积操作之前判断溢出呢？
// 1. ans * 10 + pop > INT_MAX有两种情况
//      1. ans > INT_MAX / 10,在这种情况下，无论是否考虑pop进位都会溢出
//      2. ans === INT_MAX / 10,在这种情况下，考虑进位，如果pop大于INT_MAX的个位数，就会导致溢出
// 2. ans * 10 + pop < INT_MIN
//      1. ans < INT_MIN / 10，
//      2. ans === INT_MIN / 10，且pop < INT_MIN的个位数，就会导致溢出

function reverse(x) {
    let intMax10 = Math.floor(-(1 << 31) / 10) // Math.floor(Math.pow(2,31) / 10)
    let intMin10 = Math.ceil((1 << 31) / 10) // Math.ceil(Math.pow(-2,31) / 10)
    let intMaxLast = -(1 << 31) % 10  // Math.pow(2,31) % 10
    let intMinLast = (1 << 31) % 10 // Math.pow(-2,31) % 10
    let ans = 0
    while (x) {
        let pop
        if (x > 0) {
            pop = x % 10
            x = Math.floor(x / 10)
        } else {
            pop = x % -10
            x = Math.ceil(x / 10)
        }
        
        if (ans > intMax10 || (ans === intMax10 && pop > intMaxLast)) {
            return 0
        }
        if (ans < intMin10 || (ans === intMin10 && pop < intMinLast)) {
            return 0
        }
        ans = ans * 10 + pop
        
    }
    return ans
}

let x = -123
// console.log(reverse(x))
console.log(reverse((1 << 31)))